import java.io.*;
import java.net.Socket;
import java.util.StringTokenizer;

public class ServerThread extends Thread {
	private Socket socket;
	SazanaServer parent;
	int nummer;
	PrintWriter out;
	Guy guy=null;	// Das ist mein Typ, wird vom Server gesetzt beim verbinden
	boolean clientCreated=false;
	
	public ServerThread(int num, Socket socket, SazanaServer p) {
		this.nummer=num;
		this.socket=socket;
		parent=p;
	}
	
	public void sendGuyCmd(String text) {
		
		if (clientCreated)
			out.println(text);
	}
	
	public void send(String text) {
		out.println(text);
	}
	
	public void run() {
		String text="";
		String cmdstr="";
		String valstr="";
		String chatText ="";
		System.out.println("Ich bin Thread "+nummer);
		try {
			InputStream in=socket.getInputStream();
			out=new PrintWriter(socket.getOutputStream(),true);
			int c;
			while ((c=in.read())!=-1) {
				if (c>31) text+=(char)c;  //32 = " "
				if (c==13 || c==10) {   //10/13 --> return
					if (text!="") {
						StringTokenizer st=new StringTokenizer(text,"#");
						cmdstr=text;
						valstr="";
						System.out.println(text);
						if (st.hasMoreElements()) {
							cmdstr=st.nextToken();
//							if (st.hasMoreElements())
//								valstr=st.nextToken();
						}
						if (cmdstr.equals("connect")) {
							
							String Username = "";
							String Password = "";
							
							Username = st.nextToken();
							Password = st.nextToken();
							
							if(!MakeLogin(Username, Password)) {
								send("login#fail");
								throw new Exception("Fehler beim Login");
							}
							
							send("login#success");		
							
//							System.out.println("Spieler "+valstr+" verbunden.");
//							send("player#"+nummer);	// Neuer Spieler bekommt seine eigene Nummer
//							parent.multiCast(nummer, "add#"+nummer); // Andere Spieler bekommen diese mitgeteilt
//							parent.randomSeeds.add(new Integer(parent.random.nextInt()));
//							System.out.println("Seed "+parent.randomSeeds.get(parent.randomSeeds.size()-1));
//							
//							for (int i=0; i<parent.randomSeeds.size(); i++) 
//								send("random#"+parent.randomSeeds.get(i).intValue());
//							if (parent.randomSeeds.size()>1)
//								parent.multiCast(nummer, "random#"+parent.randomSeeds.get(parent.randomSeeds.size()-1).intValue()); // Zufallszahl fuer Landschaftsgenerator verteilen
						}
						
						if (cmdstr.equals("disconnect")) {
							System.out.println("drin1");
							send("disconnect#"+ (nummer-1)+"#success");
							System.out.println("drin");
							parent.disconnect(this);									
						}
						
						if (cmdstr.equals("say")) {
							if (st.hasMoreElements())
							{
								 chatText = st.nextToken();
								 parent.broadCast("say#"+(nummer-1)+"#"+chatText);
							}							
						}
						if (cmdstr.equals("getguys")) {
							clientCreated=true;
							// Alle Spieler an den neuen Client schicken
							for (int i=0; i<parent.clientList.size(); i++) {
								send("createguy");
							}
						}
						
						// Bewegungsbefehle
						if (cmdstr.equals("up")) {
							// Spieler will nach oben gehen
							guy.MoveOben();
						}
						if (cmdstr.equals("left")) {
							// Spieler will nach links gehen
							guy.MoveLinks();
						}
						if (cmdstr.equals("down")) {
							// Spieler will nach unten gehen
							guy.MoveUnten();
						}
						if (cmdstr.equals("right")) {
							// Spieler will nach oben gehen
							guy.MoveRechts();
						}
						if(cmdstr.equals("stopleft")) {
							if (guy.dx<0) guy.dx=0;
						}
						if(cmdstr.equals("stopup")) {
							if (guy.dy<0) guy.dy=0;		
						}
						if(cmdstr.equals("stopright")) {
							if (guy.dx>0) guy.dx=0;
						}
						if(cmdstr.equals("stopdown")) {
							if (guy.dy>0) guy.dy=0;
						}
						
//						if (cmdstr.equals("quit")) {
//							System.out.println("Spieler "+valstr+" getrennt.");
//							parent.clientList.remove(this);
//						}
					}
					text="";
				}
			}
		}
		catch (Exception e) {
			System.err.println(e.toString());
		}		
	}
	
	public boolean MakeLogin(String pUsername,String pPassword) 
	{
		if (!pUsername.contains("username=") || !pPassword.contains("password=")) {
			return false;
		}
		
		pUsername = pUsername.replace("username=", "");
		pPassword = pPassword.replace("password=", "");
		
//		if (!parent.login(pUsername, pPassword, 0))
//			return false;
		
		
		return true;
	}
	


}
